//package com.jxw.cloudpen.web.microsoft;
//
//import cn.hutool.core.collection.CollectionUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.azure.ai.openai.OpenAIAsyncClient;
//import com.azure.ai.openai.OpenAIClientBuilder;
//import com.azure.ai.openai.models.*;
//import com.azure.core.credential.AzureKeyCredential;
//import com.azure.core.util.CoreUtils;
//import com.jxw.boot.exception.ServiceException;
//import com.jxw.cloudpen.web.config.MicrosoftProperties;
//import com.jxw.cloudpen.web.dto.*;
//import com.jxw.cloudpen.web.provider.ChatGptProvider;
//import com.jxw.cloudpen.web.util.I18nUtil;
//import io.netty.buffer.ByteBuf;
//import io.netty.channel.ChannelHandlerContext;
//import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//
//import java.nio.charset.StandardCharsets;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.function.Consumer;
//
///**
// * 基于微软实现的TTS
// *
// * @author liuhui
// * @email liuhui@jxwxxkj.com
// * @date 2023-07-25 20:53:27
// */
//@Slf4j
//public class MicrosoftChatGptProvider implements ChatGptProvider {
//    private static Map<String, Boolean> stopMap = new ConcurrentHashMap<>();
//    private final MicrosoftProperties microsoftProperties;
//
//    public MicrosoftChatGptProvider(MicrosoftProperties microsoftProperties) {
//        this.microsoftProperties = microsoftProperties;
//    }
//
//
//    private List<ChatRequestMessage> assmbleRequestMsgList(ChatGptRequest request) {
//        List<ChatRequestMessage> chatMessages = new ArrayList<>();
//        if (CollectionUtil.isNotEmpty(request.getChatGptTxtRequestList())) {
//            for (ChatGptTxtRequest chatGptRequest : request.getChatGptTxtRequestList()) {
//                if (StringUtils.isNotBlank(chatGptRequest.getAssistantMessage())) {
//                    chatMessages.add(new ChatRequestAssistantMessage(chatGptRequest.getAssistantMessage()));
//                } else if (StringUtils.isNotBlank(chatGptRequest.getUserMessage())) {
//                    chatMessages.add(new ChatRequestUserMessage(chatGptRequest.getUserMessage()));
//                }
//            }
//        }
//        return chatMessages;
//    }
//
//
//    @Override
//    public void chatTxt(ChatGptRequest request, ChannelHandlerContext ctx) throws ServiceException {
////        String endpoint = "https://99266-m60gkcsf-francecentral.cognitiveservices.azure.com"; // 替换为你的终结点
////        String azureOpenaiKey = "CrTPvRlLgZyQmMUQ4MAOI1NBEioGFXnW5Vzv20Equag5UOYGbJS8JQQJ99BAAC5T7U2XJ3w3AAAAACOGooZb"; // 替换为你的 API 密钥
////        String deploymentOrModelId = "gpt-4o-mini";
//
////        log.info("chatTxt is execute properties is {} ",JSONObject.toJSONString(microsoftProperties));
//        if (request.getIsStop()) {
//            stopMap.put(request.getClientId(), request.getIsStop());
//        } else {
//            OpenAIAsyncClient client = new OpenAIClientBuilder()
//                    .endpoint(microsoftProperties.getEndPoint())
//                    .credential(new AzureKeyCredential(microsoftProperties.getAzureOpenaiKey()))
//                    .buildAsyncClient();
//            List<ChatRequestMessage> chatMessages = assmbleRequestMsgList(request);
//
//            if (request.getIsStop()) {
//                stopMap.put(request.getClientId(), request.getIsStop());
//            } else {
//                stopMap.put(request.getClientId(), false);
//            }
//            client.getChatCompletionsStream(microsoftProperties.getDeploymentOrModelId(), new ChatCompletionsOptions(chatMessages))
//                    .map(chatCompletions -> {
//                        if (CoreUtils.isNullOrEmpty(chatCompletions.getChoices())) {
//                            return "";
//                        }
//                        ChatResponseMessage delta = chatCompletions.getChoices().get(0).getDelta();
//                        if (delta.getRole() != null) {
//                            System.out.println("Role = " + delta.getRole());
//                        }
//                        return delta.getContent() == null ? "" : delta.getContent();
//                    })
//                    .subscribe(
//                            new AcceptConsumer(ctx, request.getClientId()),
//                            new ErrorConsumer(ctx, request.getClientId()),
//                            new CloseConsumer(ctx, request.getClientId()));
//        }
//    }
//
//    class AcceptConsumer implements Consumer {
//        private ChannelHandlerContext ctx;
//        private String clientId;
//
//        public AcceptConsumer(ChannelHandlerContext ctx, String clientId) {
//            this.ctx = ctx;
//            this.clientId = clientId;
//        }
//
//        @Override
//        public void accept(Object o) {
//            if(stopMap.get(clientId)){
//                //主动终止
//                throw new ServiceException(Error.INTERNAL_SERVER_ERROR.getCode(),I18nUtil.getMessage("sys.err"));
//            }
//            Boolean isNotNull = true;
//            if (o instanceof String) {
//                String s = (String) o;
//                if (StringUtils.isBlank(s)) {
//                    isNotNull = false;
//                }
//            }
//            if (isNotNull) {
//                ByteBuf responseBuffer = ctx.alloc().buffer();
//                ChatGptResponse chatGptResponse = new ChatGptResponse();
//                chatGptResponse.setTxtData(o);
//                chatGptResponse.setClientId(clientId);
//                responseBuffer.writeBytes(JSONObject.toJSONString(chatGptResponse).getBytes(StandardCharsets.UTF_8));
////            log.info("chatTxt  accept is {} ",JSONObject.toJSONString(chatGptResponse));
//                ctx.channel().writeAndFlush(new TextWebSocketFrame(responseBuffer));
//            }
//        }
//    }
//
//    class ErrorConsumer implements Consumer {
//        private ChannelHandlerContext ctx;
//        private String clientId;
//
//        public ErrorConsumer(ChannelHandlerContext ctx, String clientId) {
//            this.clientId = clientId;
//            this.ctx = ctx;
//        }
//
//        @Override
//        public void accept(Object error) {
//            log.error("There was an error getting chat completions." + error);
//            ByteBuf responseBuffer = ctx.alloc().buffer();
//            ChatGptResponse chatGptResponse = new ChatGptResponse();
//            chatGptResponse.setCode(Error.INTERNAL_SERVER_ERROR.getCode());
//            chatGptResponse.setTxtData(I18nUtil.getMessage("sys.err"));
//            chatGptResponse.setClientId(clientId);
//            chatGptResponse.setEndType(2);
//            responseBuffer.writeBytes(JSONObject.toJSONString(chatGptResponse).getBytes(StandardCharsets.UTF_8));
//            ctx.channel().writeAndFlush(new TextWebSocketFrame(responseBuffer));
////            throw new ServiceException(Error.INTERNAL_SERVER_ERROR.getCode(), I18nUtil.getMessage("sys.err"));
//
//        }
//    }
//
//    class CloseConsumer implements Runnable {
//        private ChannelHandlerContext ctx;
//        private String clientId;
//
//        public CloseConsumer(ChannelHandlerContext ctx, String clientId) {
//            this.clientId = clientId;
//            this.ctx = ctx;
//        }
//
//        @Override
//        public void run() {
//            log.info("clientId : {} , Completed called getChatCompletionsStream.", clientId);
//            ByteBuf responseBuffer = ctx.alloc().buffer();
//            ChatGptResponse chatGptResponse = new ChatGptResponse();
//            chatGptResponse.setClientId(clientId);
//            chatGptResponse.setEndType(1);
//            responseBuffer.writeBytes(JSONObject.toJSONString(chatGptResponse).getBytes(StandardCharsets.UTF_8));
//            ctx.channel().writeAndFlush(new TextWebSocketFrame(responseBuffer));
//        }
//    }
//}
